/**
 * Intermediate value模型Header file
 * 
 * Include6种Algorithm的Intermediate valueCalculateFunction声明
 */

#ifndef INTERMEDIATE_MODELS_H
#define INTERMEDIATE_MODELS_H

#include <stdint.h>

// ========================================================================
// 通用接口
// ========================================================================

/**
 * InitializeIntermediate value模型（SettingsKeyetc.）
 * @param key KeyData
 */
void intermediate_model_init(const uint8_t* key);

/**
 * CalculateIntermediate value（According toConfigurationCall对应Algorithm的对应模型）
 * @param input InputData
 * @return Intermediate value（32位）
 */
uint32_t compute_intermediate_value(const uint8_t* input);

// ========================================================================
// AESIntermediate value模型
// ========================================================================

// AES S-box
extern const uint8_t AES_SBOX[256];

// AES模型Initialize
void aes_model_init(const uint8_t* key);

// AESIntermediate valueCalculateFunction
uint32_t aes_sbox_output(const uint8_t* input);
uint32_t aes_sbox_input(const uint8_t* input);
uint32_t aes_hw_sbox_output(const uint8_t* input);
uint32_t aes_hd_plaintext_sbox(const uint8_t* input);
uint32_t aes_round_key_xor(const uint8_t* input);
uint32_t aes_hw_round_key_xor(const uint8_t* input);

// ========================================================================
// SM4Intermediate value模型
// ========================================================================

// SM4 S-box
extern const uint8_t SM4_SBOX[256];

// SM4模型Initialize
void sm4_model_init(const uint8_t* key);

// SM4Intermediate valueCalculateFunction
uint32_t sm4_sbox_output(const uint8_t* input);
uint32_t sm4_sbox_input(const uint8_t* input);
uint32_t sm4_hw_sbox_output(const uint8_t* input);
uint32_t sm4_tau_transform(const uint8_t* input);
uint32_t sm4_round_function_input(const uint8_t* input);

// ========================================================================
// RSAIntermediate value模型
// ========================================================================

// RSA模型Initialize
void rsa_model_init(const uint8_t* key);

// RSAIntermediate valueCalculateFunction
uint32_t rsa_modular_multiplication(const uint8_t* input);
uint32_t rsa_square_operation(const uint8_t* input);
uint32_t rsa_hw_result(const uint8_t* input);
uint32_t rsa_modular_addition(const uint8_t* input);

// ========================================================================
// ECCIntermediate value模型
// ========================================================================

// ECC模型Initialize
void ecc_model_init(const uint8_t* key);

// ECCIntermediate valueCalculateFunction
uint32_t ecc_point_addition_x(const uint8_t* input);
uint32_t ecc_point_doubling_x(const uint8_t* input);
uint32_t ecc_scalar_mult_step(const uint8_t* input);
uint32_t ecc_hw_coordinate(const uint8_t* input);

// ========================================================================
// SM2Intermediate value模型
// ========================================================================

// SM2模型Initialize
void sm2_model_init(const uint8_t* key);

// SM2Intermediate valueCalculateFunction
uint32_t sm2_point_addition_x(const uint8_t* input);
uint32_t sm2_point_doubling_x(const uint8_t* input);
uint32_t sm2_scalar_mult_step(const uint8_t* input);
uint32_t sm2_modular_operation(const uint8_t* input);

// ========================================================================
// DilithiumIntermediate value模型
// ========================================================================

// Dilithium模型Initialize
void dilithium_model_init(const uint8_t* key);

// DilithiumIntermediate valueCalculateFunction
uint32_t dilithium_ntt_butterfly(const uint8_t* input);
uint32_t dilithium_polynomial_mult(const uint8_t* input);
uint32_t dilithium_rejection_sampling(const uint8_t* input);
uint32_t dilithium_modular_reduction(const uint8_t* input);

// ========================================================================
// 辅助Function
// ========================================================================

// Calculate汉明权重
uint32_t hamming_weight(uint32_t value);

// CalculateHamming distance
uint32_t hamming_distance(uint32_t a, uint32_t b);

#endif // INTERMEDIATE_MODELS_H
